package com.arpa.wms.mapper;

import com.arpa.wms.domain.dto.PickingDTO;
import com.arpa.wms.domain.entity.Picking;
import com.arpa.wms.domain.vo.PickingTaskDetailVO;
import com.arpa.wms.domain.vo.PickingVO;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;

import java.math.BigDecimal;
import java.util.List;

/**
 * <p>
 * 拣货单 Mapper 接口
 * </p>
 *
 * @author LEO
 * @since 2020-08-07
 */
public interface PickingMapper extends BaseMapper<Picking> {

    /**
     * 查询列表
     * @param pickingDTO
     * @return
     */
    List<PickingVO> queryList(PickingDTO pickingDTO);

    /**
     * 查询合计,包含总数
     * @param sql
     * @return
     */
    PickingVO queryListSum(@Param("sql") String sql);

    /**
     * 查询合计,包含总数
     * @param pickingDTO
     * @return
     */
    PickingVO queryListTotal(PickingDTO pickingDTO);
 /**
  *  @author: Allen chen
  *  @Date: 根据 出货单号查询分拣单 18:56
  *  @Description:
  */
    PickingVO getByDeliveryCode(PickingDTO pickingDTO);

     /**
      *  @author: Allen chen
      *  @Date: 2020/10/21 15:57
      *  @Description: 获取拣货任务明细，
      */
    PickingTaskDetailVO getTaskDetailByCode(PickingDTO pickingDTO);

    /**
     * @description
     * 尝试更新主单状态，试探明细是否完成拣货
     * @author xuyang
     * @date 2020/10/26 10:41
     * @param pickingCode:
     * @param newStatus:
     **/
    int updateStatusIfFinish(@Param("code") String pickingCode, @Param("status") String newStatus,@Param("groupCode")String groupCode);

    /**
     * 执行原生sql
     * @param sql
     * @return
     */
    int execSql(@Param("sql") String sql);

    /**
     * 通过拣货确认单信息更新拣货单信息
     * @param wavePickingCode
     */
    int updatePickingByPickingRegister(@Param("wavePickingCode") String wavePickingCode,@Param("groupCode")String groupCode);

    /**
     * 查询各订单标识对应的任务数量
     */
    List<PickingVO> queryTaskQuantityGroupByOrderTag();

    /**
     * 拣货单确认完成，更新拣货单状态
     * 更新内容：
     *  状态："2" ;FINISH_PICK("2", "拣货完成");
     *  待拣数量：0;
     *  拣货数量：picking_quantity=plan_quantity-stockout_quantity;
     * @author liuxr
     * @date 2021/5/14 18:44
     * @param pickingCode
     * @return int
     */
    int updateCheckFinsh(@Param("code") String pickingCode,@Param("groupCode") String groupCode);

    /**
     * 拣货更新库位动碰次数
     * @author liuxr
     * @date 2021/5/14 19:53
     * @param pickingCode
     */
    int updateActionNum(@Param("code") String pickingCode);

    /**
     * 更新临时库位库存状态
     * job_status：‘normal’ NORMAL("normal","正常"),
     * @author liuxr
     * @date 2021/5/14 20:04
     * @param pickingCode
     * @return int
     */
    int releaseTempInvJobStatus(@Param("code") String pickingCode);
    /**
     * 更新拣货单取消数量和状态
     * 取消数量+拣货数量+缺货数量=分配数量的时候拣货单状态为完成
     *
     * @param code
     * @param cancelQuantity
     * @return boolean
     * @author liuxr
     * @date 2021/5/17 16:33
     */
    boolean updateCancelQuantityAndStatusByCode(@Param("code") String code, @Param("cancelQuantity") BigDecimal cancelQuantity);

    /**
     * 波次拣货缺货登记，更新拣货单登记明细拣货单明细缺货数量、拣货数量、状态
     *
     * @param wavePickingCode  波次号
     * @param oldInventoryCode 原始库存标识
     * @param refundQuantity   缺货数量
     * @author liuxr
     * @date 2021/6/8 9:10
     */
    void updateItemsOutStockQuantity(@Param("wavePickingCode") String wavePickingCode,
                                     @Param("oldInventoryCode") String oldInventoryCode,
                                     @Param("refundQuantity") BigDecimal refundQuantity,
                                     @Param("groupCode") String groupCode);

    /**
     * 预打包缺货按比例更新拣货主单、拣货明细、拣货登记表数量
     *
     * @param wavePickingCode  波次号
     * @param planPickQuantity 计划拣货包裹数
     *                         param pickQuantity 实际拣货包裹数
     * @author rfwang
     * @date 2021年7月9日
     */
    void updatePrepackagedPicking(@Param("wavePickingCode") String wavePickingCode,
                                  @Param("planPickQuantity") Integer planPickQuantity,
                                  @Param("pickQuantity") Integer pickQuantity,
                                  @Param("groupCode") String groupCode);


    void cancelWaveTips(String wavePickingCode);

    /**
     * 批量更新总检单打印次数
     * @param codes
     */
    void batchGeneralPickCount(@Param("codes") List<String> codes,@Param("groupCode") String groupCode);

    /**
     * 批量更新拣货单（序号）打印次数增加
     * @param codes
     */
    void batchPickSortCount(@Param("codes") List<String> codes,@Param("groupCode") String groupCode);

    /**
     * 根据波次号更新打印次数
     * @param wavePickingCode
     */
    void updatePrintCount(@Param("wavePickingCode") String wavePickingCode,@Param("groupCode") String groupCode);
}
